#include <func.h>
int main(int argc, char *argv[])
{
    ARGS_CHECK(argc, 3)
    int sfd = socket(AF_INET, SOCK_STREAM, 0);
    ERROR_CHECK(sfd, -1, "socket")
    printf("sfd=%d\n", sfd);
    struct sockaddr_in ser_addr;
    bzero(&ser_addr, sizeof(ser_addr));
    ser_addr.sin_family = AF_INET;
    ser_addr.sin_addr.s_addr = inet_addr(argv[1]);
    ser_addr.sin_port = htons(atoi(argv[2]));
    int ret = bind(sfd, (struct sockaddr *)&ser_addr, sizeof(ser_addr));
    ERROR_CHECK(ret, -1, "bind")
    ret = listen(sfd, 10);
    struct sockaddr_in client_addr;
    bzero(&client_addr, sizeof(client_addr));
    socklen_t socklen = sizeof(client_addr);
    int new_fd;
    char buf[128] = {0};
    fd_set rdset, tmpset;
    FD_ZERO(&rdset);
    FD_SET(STDIN_FILENO, &rdset);
    FD_SET(sfd, &rdset);
    while (1)
    {
        memcpy(&tmpset, &rdset, sizeof(fd_set));
        ret = select(11, &tmpset, NULL, NULL, NULL);
        if (FD_ISSET(sfd, &tmpset))
        {
            new_fd = accept(sfd, (struct sockaddr*)&client_addr, &socklen);
            ERROR_CHECK(new_fd, -1, "accept")
            printf("client ip=%s,port=%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
            FD_SET(new_fd,&rdset);
        }
        if(FD_ISSET(STDIN_FILENO, &tmpset))
        {
            bzero(buf,sizeof(buf));
            ret=read(STDIN_FILENO,buf,sizeof(buf));
            ERROR_CHECK(ret,-1,"read")
            if(!ret)
            {
                printf("I gona leave\n");
                break;
            }
            send(new_fd,buf,strlen(buf)-1,0);
        }
        if(FD_ISSET(new_fd,&tmpset))
        {
            bzero(buf,sizeof(buf));
            ret=recv(new_fd,buf,sizeof(buf),0);
            ERROR_CHECK(ret,-1,"recv")
            if(!ret)
            {
                printf("byebye\n");
                FD_CLR(new_fd,&rdset);
                
            }
            else
            {
                printf("%s\n",buf);
            }
        }
    }
    close(new_fd);
    close(sfd);
    return 0;
}